import path from 'path'
/**
 * 传入完整路由过滤获取所有子路由
 * @param { * } routes
 */
const getChildrenRoutes = (routes) => {
  const result = []
  routes.forEach((route) => {
    if (route.children && route.children.length > 0) {
      /**
       * 此处为什么不使用递归？不考虑第三层路由？
       * router.getRoutes() 获取到的路由是完整的，深层路由同时也会被赋值在表层，所以完全不需要去递归
       * 我们只需要获取第二层数据即可，第二层数据被表层数据包裹的同时，第二层数据也被展示在了表层
       * 由此还是可以用表层中第二层数据获取自身children的第三层数据, 同时第三层也会被表层包裹，以此类推获取第四层数据
       */
      result.push(...route.children)
    }
  })
  return result
}

/**
 * 处理脱离层级的路由
 */
export const filterRouters = (routes) => {
  // 1. 获取所有子路由
  const childrenRoutes = getChildrenRoutes(routes)
  console.log(childrenRoutes, '第二步获取到子级的完整路由')
  // 2. 根据子级路由，进行查重
  return routes.filter((route) => {
    return !childrenRoutes.find((childrenRoute) => {
      return childrenRoute.path === route.path
    })
  })
}
// 判断数据是否为空
function isNull(data) {
  if (!data) return true
  if (JSON.stringify(data) === '{}') return true
  if (JSON.stringify(data) === '[]') return true
}
/**
 * 根据routes数据，返回对应的menu规则数据
 * @param {*} routes
 * @param {*} basePath
 */
export function generateMenus(routes, basePath = '') {
  const result = []
  // 遍历路由表
  routes.forEach((item) => {
    // 不存在 children && 不存在 meta 直接 return
    if (isNull(item.meta) && isNull(item.children)) return
    // 存在 children 不存在 meta，进入迭代
    if (isNull(item.meta) && !isNull(item.children)) {
      result.push(...generateMenus(item.children))
      return
    }
    // 子级合并父级 path 作为跳转路径
    const routePath = path.resolve(basePath, item.path)
    // 路由分离之后，存在同名父路由的情况，需要进行查重，可能存在多个同名父路由，以第一个为准
    let route = result.find((item) => item.path === routePath)
    // 存在 route 生成 children
    if (route) {
      result.forEach((i) => {
        if (i.path === routePath) {
          i.children.push(...generateMenus(item.children, route.path))
        }
      })
    }
    // 不存在 route 生成 route 对象
    if (!route) {
      route = {
        ...item,
        path: routePath,
        children: [],
      }

      // 存在 children 进入迭代到children
      if (item.children) {
        console.log(item.children, 'item.children')
        route.children.push(...generateMenus(item.children, route.path))
      }

      // icon 与 title 必须全部存在
      if (route.meta.icon && route.meta.title) {
        // meta 存在生成 route 对象，放入 arr
        result.push(route)
      }
    }
  })
  return result
}
